package com.yejiali.backend.common.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;


/**
 * @Author:yejiali
 * @Date:2025/5/16-05-16-14:29
 * @Decsription:com.yejiali.backend.common.aspect
 * @Version:1.0
 */
@Aspect
@Component
@Slf4j
public class LoggingAspect {
    //定义切点
    @Pointcut("@annotation(com.yejiali.backend.common.annotaion.SystemLog)")
    public void logPointcut(){}

    //环绕通知:记录方法执行时间、参数和返回值
    @Around("logPointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        //获取方法名称
        String methodName = joinPoint.getSignature().getName();
        //获取类名
        String className = joinPoint.getTarget().getClass().getSimpleName();
        //获取方法参数
        Object[] args = joinPoint.getArgs();

        //记录方法开始执行时间
        log.info("[{}] 方法调用开始 | 参数: {}", className + "." + methodName, args);
        long startTime = System.currentTimeMillis();
        //执行方法
        Object result;
        try {
            result = joinPoint.proceed();
        } catch (Throwable e) {
            //记录异常信息
            log.error("[{}] 方法执行异常 | 异常信息: {}", className + "." + methodName, e.getMessage(), e);
            throw new RuntimeException(e);
        } finally {
            //记录方法执行时间
            long endTime = System.currentTimeMillis();
            long executionTime = endTime - startTime;
            log.info("[{}] 方法执行耗时: {} ms", className + "." + methodName, executionTime);
        }
        //记录返回结果
        // 记录方法返回结果（避免记录大对象）
        log.info("[{}] 方法返回结果: {}", className + "." + methodName, result);
        return result;


    }
}
